/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package tarea1automatas;
//using java.util

import java.io.*;
import java.util.*;
import java.util.ArrayList;

/**
 *
 * @author MarioEspinoza
 */
public class Main {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {

        String fileName = null;
        boolean leyendoNombreArchivo;
        boolean ejecutarComando = true;
        boolean ejecutarAplicacion = true;
        ArrayList<String> lineasArchivo ;

        while (ejecutarAplicacion) {
            try {
                leyendoNombreArchivo = true;
                lineasArchivo = new ArrayList<String>();
                System.out.println("Bienvenido al traductor de Automatas Finitos\n");
                BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

                while (leyendoNombreArchivo) {
                    System.out.println("Ingrese ruta de archivo .txt a abrir");
                    fileName = br.readLine();
                    if (fileName.endsWith(".txt")) {
                        leyendoNombreArchivo = false;
                    }
                }
                FileReader fr = new FileReader(fileName);

                Scanner s = new Scanner(fr);

                while (s.hasNext()) {
                    String linea = s.nextLine();
                    System.out.println(linea);
                    lineasArchivo.add(linea);
                }

                AutomataFinito af = new AutomataFinito();

                af.leerAutomataFinito(lineasArchivo);

                if(af.isEsDeterminista())
                    System.out.println("este Automata es Determinista");
                else
                    System.out.println("este Automata es No Determinista");

                Scanner sCom = new Scanner(System.in);

                while (ejecutarComando) {
                    System.out.println("Ingrese comando a ejecutar\n"
                            + "1 - Escribir Archivo\n"
                            + "2 - Testear AFD\n"
                            + "3 - Testear AFND\n"
                            + "4 - Verificar palabra en el lenguaje\n"
                            + "5 - Salir ");

                    String com = sCom.nextLine();

                    int intCmm = Integer.parseInt(com);

                    //@todo Analizar lista de comandos

                    switch (intCmm) {
                        case 1:
                        {
                            af.escribirAutomataFinito();
                            break;
                        }
                        case 2:
                        {
                            if(af.isEsDeterminista())
                                menuAFD(af);
                            else
                                System.out.println("Este automata es no determinista, no se puede acceder a este menu");
                            AFD afd = new AFD();
                            afd.reconocerAFD(lineasArchivo);
                         
                            break;
                        }
                        case 3:
                        {
                            if(!af.isEsDeterminista())
                                menuAFND(af);
                            else
                                System.out.println("Este automata es determinista, no se puede acceder a este menu");
                            break;
                        }
                        case 4:
                        {
                            System.out.println("Ingrese palabra a reconocer");

                            String palabra = sCom.nextLine();

                            if(af.pertenecePalabraAlLenguaje(palabra))
                                System.out.println("La Palabra pertenece al Lenguaje");
                            else
                                System.out.println("La Palabra no pertenece al Lenguaje");
                            break;
                        }
                        case 5:
                            ejecutarComando = false;                            
                            break;
                        default:
                            System.out.println("Ingrese comando Valido");
                            break;
                    }
                    ejecutarAplicacion = false;
                }                

                System.out.println("Terminando Ejecucion");
            } catch (Exception e) {
                e.printStackTrace();
                System.out.println(e.getClass()+e.getMessage());
            }
        }
    }

    public static void menuAFND(AutomataFinito af)
    {
        boolean enMenu = true;
        Scanner sMenu = new Scanner(System.in);

        AFND afnd = new AFND(af);
        while(enMenu)
        {
            System.out.println("Ingrese comando a ejecutar\n"
                            + "1 - Escribir Archivo\n"
                            + "2 - AFD Equivalente\n"
                            + "3 - Salir ");

            String com = sMenu.nextLine();

            int intCmm = Integer.parseInt(com);

            //@todo Analizar lista de comandos AFND

            switch (intCmm) {
                case 1:{
                    afnd.escribirAutomataFinito();
                    break;
                }
                case 2:{
                    AFD equivalente = afnd.afdEquivalente();
                    System.out.println("AFD equivalente tiene "+equivalente.cantidadEstados);
                    equivalente.escribirAutomataFinito();
                    break;
                }
                case 3:{
                    enMenu=false;
                    break;
                }
                default:
                    System.out.println("Comando Invalido");
                    break;

            }
        }
    }

    public static void menuAFD(AutomataFinito af)
    {
        boolean enMenu = true;
        Scanner sMenu = new Scanner(System.in);

        AFD afd = new AFD(af);
        while(enMenu)
        {
            System.out.println("Ingrese comando a ejecutar\n"
                            + "1 - Escribir Archivo\n"
                            + "2 - AFD Minimo\n"
                            + "3 - Salir ");

            String com = sMenu.nextLine();

            int intCmm = Integer.parseInt(com);

            //@todo Analizar lista de comandos AFD

            switch (intCmm) {
                case 1:{
                    afd.escribirAutomataFinito();
                    break;
                }
                case 2:{
                    AFD minimo = afd.afdMinimo();
                    minimo.escribirAutomataFinito();
                    break;
                }
                case 3:{
                    //afd.
                    enMenu=false;
                    break;
                }
                default:
                    System.out.println("Comando Invalido");
                    break;

            }
        }
    }
}

